#include "main.h"
#define LOG_TAG          "MAIN"
#include "elog.h"
// 开始任务句柄
TaskHandle_t            start_handler;
TaskHandle_t            test_handler;
// 全局串口的互斥信号量   目前easylogger使用
SemaphoreHandle_t			  g_usart_tx_mutex;

// 测试任务
void test_task(void* pvParameters)
{
    if (!ap3216c_init()) log_e("ap3216 init error");
    if (!ntc_drv_init()) log_e("ntc init error");
    int res;
    while (1) {
        res = ap3216c_get_als();
        log_i("ap3216c alc value %d", res);
        res = ntc_trigger_and_get_temp();
        log_i("ntc value %d", res);
        vTaskDelay(1000);
    }
}

/**
 * @desc  : 硬件驱动初始化都放在这
 * @date  : 2025-11-05
 * @author: AnRui
 * @note  : FreeRTOS启动后进入 线程 用户级 无法修改关键寄存器
 *					如果修改了中断控制器  DWT等 必须在DrvInit 执行
 */
static void DrvInit(void)
{
    UsartDrvInit();
    DwtDelayInit();
    DwtDelayNms(1000);
}


/**
 * @desc  : 软件协议类初始化
 * @date  : 2025-11-05
 * @author: AnRui
 * @note  :
 */
static void AppInit(void)
{
		
    //easylogger 初始化
    elog_init();
    elog_set_filter_lvl(ELOG_LVL_INFO);  // 动态的修改输出级别  标签   函数名 行数
    elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_TAG | ELOG_FMT_FUNC | ELOG_FMT_LINE);
    elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_TAG | ELOG_FMT_FUNC | ELOG_FMT_LINE);
    elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_TAG | ELOG_FMT_FUNC | ELOG_FMT_LINE);
    elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL);
    elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_TAG | ELOG_FMT_FUNC | ELOG_FMT_LINE);
    elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_TAG | ELOG_FMT_FUNC | ELOG_FMT_LINE);
    elog_start();
    shell_init();
    sample_drv_adapter_init();
    switch_drv_adapter_init();
    middle_layer_init();
    busi_layer_init();
}


// 开始任务
void start_task(void* pvParameters)
{
    taskENTER_CRITICAL();
    g_usart_tx_mutex = xSemaphoreCreateMutex();  // 全局串口信号量
    AppInit(); //  内部需要全局信号量
    // xTaskCreate(test_task, "test_task", 128, NULL, 1, &test_handler);
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();
}

int main(void)
{
    nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
    DrvInit();
    FatfsInit();//需要使用的栈空间为4096 以上 所以不放在任务中
    printf("init\r\n");
    // 硬件驱动初始化
    xTaskCreate(start_task, "start_task", 512, NULL, 1, &start_handler);
    vTaskStartScheduler();
    while (1) {
    }
}
